package cn.lili.modules.other.serviceimpl;

import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.SceneEnums;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.other.mapper.PageDataMapper;
import cn.lili.modules.other.service.PageDataService;
import cn.lili.modules.page.entity.dos.PageData;
import cn.lili.modules.page.entity.dto.PageDataSaveDTO;
import cn.lili.modules.page.entity.dto.PageDataSearchParams;
import cn.lili.modules.page.entity.dto.PageDataShowParams;
import cn.lili.modules.page.entity.enums.PageTypeEnum;
import cn.lili.modules.page.entity.vos.PageDataVO;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.mybatis.util.SceneHelp;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static cn.hutool.core.text.CharSequenceUtil.isEmpty;

/**
 * 楼层装修管理业务层实现
 *
 * @author Bulbasaur
 * @since 2020/12/11 9:15
 */
@Service
public class PageDataServiceImpl extends ServiceImpl<PageDataMapper, PageData> implements PageDataService {


    @Override
    public PageData detail(String id) {
        PageData pageData = this.getById(id);
        SceneHelp.objectAuthentication(pageData);
        return pageData;
    }

    @Override
    @Transactional
    public PageData addPageData(PageDataSaveDTO pageDataSaveDTO) {

        //参数校验
        pageDataSaveDTO.checkParamsSelf();


        PageData pageData = new PageData(pageDataSaveDTO);
        pageData.setId(SnowFlake.getIdStr());


        //管理员可以装修所有数据，如果是店铺或者其他角色，则只能修改装饰自己的数据
        if (!UserContext.getCurrentUser().getScene().equals(SceneEnums.MANAGER)) {
            //处理页面信息
            SceneHelp.objectHandler(pageData);
        } else {
            //如果是管理员，则设置为管理员场景 & 如果已经传入了必要参数，则按照传入的参数进行处理
            if (isEmpty(pageData.getScene())) {
                pageData.setScene(SceneEnums.MANAGER.name());
                pageData.setExtendId("-1");
            }
        }

        //保存页面信息
        this.save(pageData);
        //如果开启首页，则关闭其他首页
        if (pageData.getMain() && pageData.getPageType().equals(PageTypeEnum.INDEX.name())) {
            releaseIndex(pageData.getId());
        }
        return pageData;
    }

    @Override
    @Transactional
    public PageData updatePageData(PageDataSaveDTO pageDataSaveDTO) {
        //旧数据非空判定+鉴权
        PageData pageData = getById(pageDataSaveDTO.getId());
        if (pageData == null) {
            throw new ServiceException(ResultCode.PAGE_NOT_EXIST);
        }

        SceneHelp.objectAuthentication(pageData);

        BeanUtil.copyProperties(pageDataSaveDTO, pageData);

        // 修改页面
        UpdateWrapper updateWrapper = new UpdateWrapper();
        SceneHelp.queryHandler(updateWrapper, true);
        updateWrapper.eq("id", pageDataSaveDTO.getId());
        this.update(pageData, updateWrapper);

        if (pageDataSaveDTO.getMain().equals(true) && pageData.getPageType().equals(PageTypeEnum.INDEX.name())) {
            UpdateWrapper updateMainWrapper = new UpdateWrapper();
            updateMainWrapper.eq("page_type", PageTypeEnum.INDEX.name());
            updateMainWrapper.eq("use_scene", pageData.getUseScene());
            updateMainWrapper.eq("page_client_type", pageData.getPageClientType());
            updateMainWrapper.eq("extend_id", pageData.getExtendId());
            updateMainWrapper.ne("id", pageData.getId());
            updateMainWrapper.set("main", false);
            this.update(updateMainWrapper);
        }

        return pageData;
    }

    @Override
    public PageData updateStatus(String id, Boolean enable) {
        PageData pageData = this.getById(id);
        if (pageData == null) {
            throw new ServiceException(ResultCode.PAGE_NOT_EXIST);
        }
        //鉴定操作权限
        SceneHelp.objectAuthentication(pageData);

        //修改页面状态
        LambdaUpdateWrapper<PageData> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
        lambdaUpdateWrapper.eq(PageData::getId, id);
        lambdaUpdateWrapper.set(PageData::getEnable, enable);
        this.update(lambdaUpdateWrapper);
        return pageData;
    }

    @Override
    @Transactional
    public PageData releaseIndex(String id) {

        PageData pageData = this.getById(id);
        if (pageData == null) {
            throw new ServiceException(ResultCode.PAGE_NOT_EXIST);
        }
        if (Boolean.TRUE.equals(pageData.getMain())) {
            return pageData;
        }

        //鉴定操作权限
        SceneHelp.objectAuthentication(pageData);

        //关闭所有首页
        UpdateWrapper updateWrapper = new UpdateWrapper();
        updateWrapper.eq("page_type", PageTypeEnum.INDEX.name());
        updateWrapper.eq("use_scene", pageData.getUseScene());
        updateWrapper.eq("page_client_type", pageData.getPageClientType());
        updateWrapper.eq("extend_id", pageData.getExtendId());
        updateWrapper.set("main", false);
        this.update(updateWrapper);

        //启用当前首页
        updateWrapper = new UpdateWrapper();
        updateWrapper.eq("id", id);
        updateWrapper.eq("use_scene", pageData.getUseScene());
        updateWrapper.eq("page_client_type", pageData.getPageClientType());
        updateWrapper.eq("extend_id", pageData.getExtendId());
        updateWrapper.set("main", true);
        this.update(updateWrapper);

        return pageData;
    }

    @Override
    @Transactional
    public void deletePageData(String id) {

        PageData pageData = this.getById(id);


        if (pageData == null) {
            throw new ServiceException(ResultCode.PAGE_NOT_EXIST);
        }

        //店铺、平台首页需要判断是否开启，开启则无法删除
        if (Boolean.TRUE.equals(pageData.getMain())) {
            throw new ServiceException(ResultCode.PAGE_OPEN_DELETE_ERROR);
        }

        LambdaQueryWrapper<PageData> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(PageData::getScene, pageData.getScene());
        if (this.count(queryWrapper) <= 1) {
            throw new ServiceException(ResultCode.PAGE_DELETE_ERROR);
        }

        this.removeById(id);
    }

    @Override
    public PageDataVO getPageData(PageDataShowParams params) {
        //组建查询参数
        LambdaQueryWrapper<PageData> queryWrapper = new LambdaQueryWrapper<>();
        //页面开启
        queryWrapper.eq(PageData::getEnable, true);
        queryWrapper.eq(PageData::getMain, true);
        //客户端类型
        queryWrapper.eq(PageData::getPageClientType, params.getPageClientType());

        //店铺、供应商 需判定场景ID
        if (params.getUseScene().equals(SceneEnums.STORE) || params.getUseScene().equals(SceneEnums.SUPPLIER)) {
            //如果 场景扩展id为空 或者 场景为空则异常
            if (isEmpty(params.getExtendId()) || params.getUseScene() == null) {
                throw new ServiceException(ResultCode.PAGE_NOT_EXIST);
            }
        }

        queryWrapper.eq(CharSequenceUtil.isNotEmpty(params.getExtendId()), PageData::getExtendId, params.getExtendId());

        //场景
        queryWrapper.eq(PageData::getUseScene, params.getUseScene().name());
        //页面类型
        queryWrapper.eq(PageData::getPageType, params.getPageType().name());

        //如果是专题类型，则查询id为专题id
        queryWrapper.eq(params.getPageType().equals(PageTypeEnum.SPECIAL) && StringUtils.isNotEmpty(params.getSpecialId()),
                PageData::getId, params.getSpecialId());

//        params.getPageType().equals(PageTypeEnum.INDEX)){
//            //如果 场景扩展id为空 或者 场景为空则异常
//            if (CharSequenceUtil.isEmpty(params.getExtendId()) || params.getScene() == null) {
//                throw new ServiceException(ResultCode.PAGE_NOT_EXIST);
//            }
//
//            queryWrapper.eq(PageData::getExtendId, params.getExtendId());
//
//        }

        PageData pageData = this.getOne(queryWrapper, false);

        return new PageDataVO(pageData);

    }

    @Override
    public Page<PageData> getPageDataList(PageVO pageVO, PageDataSearchParams params) {
        UpdateWrapper<PageData> queryWrapper = new UpdateWrapper<>();

        //查询参数构造
        queryWrapper.eq(params.getPageType() != null, "page_type", params.getPageType().value());

        queryWrapper.eq(params.getUseScene() != null, "use_scene", params.getUseScene().value());

        queryWrapper.eq(params.getPageClientType() != null, "page_client_type", params.getPageClientType().name());

        SceneHelp.queryHandler(queryWrapper);

        return this.baseMapper.selectPage(PageUtil.initPage(pageVO), queryWrapper);

    }

    @Override
    public List<PageData> getByGoodsId(String goodsId) {
        LambdaQueryWrapper<PageData> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(PageData::getPageData, goodsId);
        return this.baseMapper.selectList(queryWrapper);
    }
}